package y.q.h.util;

import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;

import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.Map;

import static cn.hutool.core.text.CharSequenceUtil.toUnderlineCase;

/**
 * 实体类转换为Map
 *
 * @author SongRenShuo
 * @date 2023/08/21
 */
public class EntityToMapUtil {

//    /**
//     * 测试实体转为Map
//     */
//    public static void main(String[] args) throws IllegalAccessException {
//        // 创建实体对象
//        User user = new User();
//        // 设置其他字段值
//        user.setId(1);
//        user.setUsername("zhangSan");
//        user.setPassword("123456");
//        // 开始转换
//        entityToMap(user);
//
//        // 创建实体对象
//        Users users = new Users();
//        // 设置其他字段值
//        users.setId(1);
//        users.setUserName("zhangSan");
//        users.setPassWord("123456");
//        // 开始转换
//        entityToMap(users, true);
//    }


    /**
     * 将实体类转换为Map
     *
     * @param entity 要转换的实体类对象
     * @return 转换后的Map对象
     * @throws IllegalAccessException 非法访问异常
     */
    public static Map<String, Object> entityToMap(Object entity) throws IllegalAccessException {

        return entityToMap(entity, false);
    }

    /**
     * 将实体类转换为Map
     *
     * @param entity 要转换的实体类对象
     * @param isHump 是否转换为驼峰 helloWorld -> hello_world
     * @return 转换后的Map对象
     * @throws IllegalAccessException 非法访问异常
     */
    public static Map<String, Object> entityToMap(Object entity, Boolean isHump) throws IllegalAccessException {
        // 创建一个空的Map对象
        Map<String, Object> map = new LinkedHashMap<>();
        // 获取实体类的Class对象
        Class<?> clazz = entity.getClass();
        // 获取实体类的名称
        String tableName = clazz.getSimpleName();
        // 将表名存入map中
        map.putIfAbsent("tableName", "`" + tableName + "`");
        if (isHump) {
            map.put("tableName", "`" + toUnderlineCase(tableName) + "`");
        }
        // 获取实体类中的所有属性
        Field[] fields = clazz.getDeclaredFields();
        // 遍历所有属性，将属性值添加到Map中
        for (Field field : fields) {
            // 设置属性可访问
            field.setAccessible(true);
            // 获取属性值
            Object value = field.get(entity);
            // 将属性名和属性值添加到Map中
            if (isHump && ObjectUtils.isNotEmpty(field.getName())) {
                map.put(toUnderlineCase(field.getName()), value);
            } else {
                map.put(field.getName(), value);
            }
        }
        // 输出转换前和转换后的实体类对象和Map对象
        System.out.println("转换前(实体): " + entity);
        System.out.println("转换后(Map): " + map);
        // 输出实体类和Map对象的类型
//        System.out.println("转换前数据类型: " + entity.getClass().getName());
//        System.out.println("转换后数据类型: " + map.getClass().getName());
        // 返回转换后的Map对象
        return map;
    }


//    @Data
//    static
//    class Users {
//        /**
//         * 主键
//         */
//        private Integer id;
//        /**
//         * 姓名
//         */
//        private String userName;
//        /**
//         * 密码
//         */
//        private String passWord;
//    }

}
